/*==========================================================
    模块名 :    RtspClt
    文件名 ：   tools.h
    相关文件 ：  
    实现功能 ： 轻量的http服务，用于接收http post请求
    作者：      范瑞彪
    版 权 ：    <Copyright(C) 2023-2027 Suzhou Keda Technology Co., Ltd. 
    All rights reserved.> 
    ------------------------------------------------------------------------------------------------------- 
    修改记录：
    日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
==========================================================*/
#ifndef RTSPCLT_HTTPSERVER_H
#define RTSPCLT_HTTPSERVER_H
#include "pub_defs.h"

// @brief http客户端连接相关数据，包含主机地址，连接套接字
typedef struct tagHttpClientInfo
{
    char achHost[IPV4_BUF_LEN];     // 主机地址
    int nSocket;                    // 连接套接字
}HttpClientInfo,*PHttpClientInfo;

// @brief http请求控制信息
typedef struct tagControlInfo
{
    int nPause;                             // (0 未设置 1 继续播放 2 暂停播放)
    int nPlayScale;                         // 播放速录控制 （0 未设置 1 0.5倍慢放，2 正常速率播放 3 2倍快放）
    int nSkip;                              // 播放跳转 （0 未设置 其他跳转到指定ntp位置播放)
}ControlInfo,*PControlInfo;

// @brief post请求参数保存结构体
typedef struct tagHttpPostBodyInfo
{
    int nSessionId;                         // 操作会话id
    char achToken[POST_PARAM_VAL_BUF_LEN];  // token用于过滤重复请求
    char achUrl[POST_PARAM_VAL_BUF_LEN];    // 拉流url
    int nRtpPort;                           // 接收rtp数据端口
    int nRtcpPort;                          // 接收rtcp数据端口
    char achPlayType[POST_PARAM_VAL_BUF_LEN];   // 播放类型（play，playback)
    char achTimeStamp[POST_PARAM_VAL_BUF_LEN]; // http请求时间戳
    ControlInfo tControlInfo;               // 控制请求
}HttpPostBodyInfo,*PHttpPostBodyInfo;

/*========================================================== 
    函数名 ：   StartHttpServer
    功能 ：		开启http服务
    算法实现 ： <可选项> 
    参数说明 ： int     nServerPort     [in]    服务监听端口号
                int     nTokenCacheCnt [in]     缓存token个数，用于过滤重复请求
    返回值说明：-1 服务启动失败（端口绑定失败）0 成功，服务启动成功，会阻塞线程，此方法不会退出
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int StartHttpServer(int nServerPort,int nTokenCacheCnt);

/*========================================================== 
    函数名 ：   CBHttpClientHandle
    功能 ：		处理http连接函数
    算法实现 ： <可选项> 
    参数说明 ： void*     pArg     [in]    HttpClientInfo结构体，包含http连接信息,需要在函数体释放
    返回值说明：
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void CBHttpClientHandle(void *pArg);

/*========================================================== 
    函数名 ：   HanldeHttpReq
    功能 ：		处理http请求
    算法实现 ： <可选项> 
    参数说明 ： char*     paBuffer     [in]    http客户端请求数据
               PHttpClientInfo   info  [in]    HttpClientInfo结构体，包含http连接信息,需要在函数体释放
    返回值说明：
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void HanldeHttpReq(const char *paBuffer,const PHttpClientInfo info);

/*========================================================== 
    函数名 ：   ParsePostReq
    功能 ：		处理post请求
    算法实现 ： <可选项> 
    参数说明 ： char*     paBuffer     [in]    http客户端请求数据
               PHttpClientInfo   info  [in]    HttpClientInfo结构体，包含http连接信息,需要在函数体释放
    返回值说明：
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void ParsePostReq(const char *paBuffer,const PHttpClientInfo info);

/*========================================================== 
    函数名 ：   ParsePostBody
    功能 ：		解析post body数据
    算法实现 ： <可选项> 
    参数说明 ： char*     paBody     [in]      http客户端请求body
               PHttpPostBodyInfo   info  [out] 传出解析post请求body
    返回值说明：0 解析成功 -1 失败
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int ParsePostBody(const char *paBody,PHttpPostBodyInfo info);

/*========================================================== 
    函数名 ：   IsValidPostParam
    功能 ：		检测判断post参数是否有效
    算法实现 ： <可选项> 
    参数说明 ： PHttpPostBodyInfo   info  [in] 传入解析post请求参数
    返回值说明：0 参数有效 1 无效
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int IsValidPostParam(PHttpPostBodyInfo info);

/*========================================================== 
    函数名 ：   SendHttpRep
    功能 ：		发送http返回
    算法实现 ： <可选项> 
    参数说明 ：  int    nSocket  [in] socket描述符
                int    nErrCode [in] 错误码
                char*  pchDescribe [in] 错误描述
                char*  pchBody  [in] 回复体
    返回值说明：0 参数有效 1 无效
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void SendHttpRep(int nSocket,int nErrCode,char *pchDescribe,char *pchBody);

#endif //RTSPCLT_HTTPSERVER_H